package com.example.demo.demos.util;

import java.util.*;

public class StringListToMapConverter {

    public static Map<String, Map<String, List<Integer>>> convertListToMap(List<String> strList) {
        Map<String, Map<String, List<Integer>>> resultMap = new TreeMap<>();

        for (String str : strList) {
            String[] parts = str.split("/");
            if (parts.length == 3) {
                String key1 = parts[0];
                String key2 = parts[1];
                int value = Integer.parseInt(parts[2]);
                // 获取或创建第一个级别的 Map
                Map<String, List<Integer>> innerMap = resultMap.getOrDefault(key1, new TreeMap<>());
                resultMap.putIfAbsent(key1, innerMap);
                // 获取或创建第二个级别的 List，并确保它是排序的
                List<Integer> valueList = innerMap.getOrDefault(key2, new ArrayList<>());
                innerMap.putIfAbsent(key2, valueList);
                boolean added = valueList.add(value); // add 返回 true 如果列表被修改了（即元素被成功添加）
                if (added) { // 通常这总是 true，除非值已经存在（但在这个例子中我们允许重复值，所以总是 true）  
                    Collections.sort(valueList);
                }
            }
        }
        for (Map<String, List<Integer>> innerMap : resultMap.values()) {
            for (List<Integer> valueList : innerMap.values()) {
                Collections.sort(valueList); // 在这里对列表进行一次性排序  
            }
        }
        return resultMap;
    }

    public static void main(String[] args) {
        /**
         * 题目：将字符串转换成map
         * 内容：一个已经初始化的string list，其中每个string为"name1/name2/name3"，将这个list转换成map。
         * 如：list为[
         * "a1/b11/2",
         * "a1/b11/1",
         * "a1/b12/8",
         * "a2/b21/5",
         * "a2/b21/4",
         * ]
         * 转换为如下Map：(注意，name3是一个整形数字，需要排序)
         * {
         *     "a1": {
         *         "b11": [1,2],
         *         "b12": [8]
         *     },
         *     "a2": {
         *         "b21": [4,5]
         *     }
         * }
         */

        List<String> strList = Arrays.asList(
                "a1/b11/2",
                "a1/b11/1",
                "a1/b12/8",
                "a2/b21/5",
                "a2/b21/4"
        );

        Map<String, Map<String, List<Integer>>> resultMap = convertListToMap(strList);

        // 打印结果 Map（这里使用了递归的方法来打印嵌套的 Map 结构）  
        printMap(resultMap, "");
    }

    // 辅助方法：递归打印 Map  
    private static void printMap(Map<?, ?> map, String indent) {
        for (Map.Entry<?, ?> entry : map.entrySet()) {
            Object key = entry.getKey();
            Object value = entry.getValue();
            System.out.println(indent + key + ":");
            if (value instanceof Map) {
                printMap((Map<?, ?>) value, indent + "    ");
            } else if (value instanceof List) {
                List<?> list = (List<?>) value;
                for (Object item : list) {
                    System.out.println(indent + "    " + item);
                }
            } else {
                System.out.println(indent + "    " + value);
            }
        }
    }
}